var express = require('express');
var router = express.Router();
const tools = require("../tools");
const user = require("../sql/user");
const sql = require("../sql/sql");
const uuid = require("uuid");
const md5 = require("md5");

const jwt = require("jsonwebtoken");

// 随机验证码功能
function random(n){
    return Math.random().toString().substr(2, n)
}



/**
* @apiGroup 用户信息
* @api {post} /api/user/send 发送短信验证码
* @apiVersion 0.0.0
* @apiDescription 根据手机号发送短信验证码
* @apiParam {Number} tel 手机号
* @apiSuccess {number} code 请求状态
* @apiSuccess {string} title 请求说明
* @apiSuccess {array} data 请求数据
* @apiSuccessExample {json} Success-Response:
* {
*    "code":200,
*    "title":"请求成功",
*    "data":成功信息
* }
* @apiError {number} code 请求状态
* @apiError {string} title 请求说明
* @apiError {array} data 请求数据
* @apiErrorExample {json} Error-Response:
* {
*    "code":201,
*    "title":"请求失败",
*    "data":报错信息
* }
* @apiSampleRequest http://localhost:3000/api/user/send
*/

router.post('/send', function(req, res, next) {
    // 生成随机验证码
    const code = random(4);
    // 接收到的手机号
    const tel = req.body.tel-0;

    sql.get({
        colName:user,
        where:{tel}
    }).then(data=>{
        console.log(data);
        if(data.length < 1){
            // 调用发送短信验证码功能
            tools.send(tel, code).then((result) => {
                // 发送成功之后，将手机号和验证码存储到用户集合中，以备注册使用
                sql.insert({
                    colName:user,
                    data:{
                        tel, code
                    }
                }).then(()=>{
                    res.send({
                        code:200,
                        title:"短信验证码第一次发送成功",
                        data:result,
                        SMScode:code
                    })
                })
            },(err) => {
                res.send({
                    code:201,
                    title:"短信验证码发送失败",
                    data:err
                })
            });
        }else{
            if(data[0].userName){
                res.send({
                    code:202,
                    title:"该手机号已被注册",
                    data:"NOTDATA"
                })
            }else{
                // 调用发送短信验证码功能
                tools.send(tel, code).then((result) => {
                    // 发送成功之后，将手机号和验证码存储到用户集合中，以备注册使用
                    sql.insert({
                        colName:user,
                        data:{
                            tel, code
                        }
                    }).then(()=>{
                        res.send({
                            code:200,
                            title:"短信验证码再次发送成功",
                            data:result,
                            SMScode:code
                        })
                    })
                },(err) => {
                    res.send({
                        code:201,
                        title:"短信验证码发送失败",
                        data:err
                    })
                });
            }
        }
    })
});


/**
* @apiGroup 用户信息
* @api {post} /api/user/register 用户注册
* @apiVersion 0.0.0
* @apiDescription 根据用户名+手机号+密码注册账号
* @apiParam {String} username 用户名
* @apiParam {String} password 密码
* @apiParam {Number} tel 手机号
* @apiParam {Number} code 短信验证码
* @apiSuccess {number} code 请求状态
* @apiSuccess {string} title 请求说明
* @apiSuccess {array} data 请求数据
* @apiSuccessExample {json} Success-Response:
* {
*    "code":200,
*    "title":"注册成功",
*    "data":"用户id"
* }
* {
*    "code":201,
*    "title":"用户名重复",
*    "data":"NOTDATA"
* }
* {
*    "code":202,
*    "title":"请先发送短信验证码",
*    "data":"NOTDATA"
* }
* {
*    "code":203,
*    "title":"一个手机号只能注册一个用户名",
*    "data":"NOTDATA"
* }
* {
*    "code":204,
*    "title":"验证码不对",
*    "data":"NOTDATA"
* }
* @apiSampleRequest http://localhost:3000/api/user/register
*/
router.post('/register', function(req, res, next) {
    // 将要接收到的注册信息
    const un = req.body.username;
    const pw = req.body.password;
    const tel = req.body.tel;
    const code = req.body.code;

    // 1. 先根据用户名读取数据
    sql.get({
        colName:user,
        where:{userName:un}
    }).then(userData=>{
        // 2. 判断是否读取到数据
        if(userData.length < 1){
            // 4. 根据用户名未读取到数据
            // 5. 根据手机号读取数据，验证是否发送过验证码
            sql.get({
                colName:user,
                where:{tel}
            }).then(telData=>{
                // 6. 根据手机号，没有读取到数据
                if(telData.length<1){
                    // 7. 没有发送过验证码
                    res.send({
                        code:202,
                        title:"请先发送短信验证码",
                        data:"NOTDATA"
                    })
                }else{
                    // 8. 根据手机号读取到数据了，还需要判断该手机号下是否已有用户名
                    if(telData[0].userName){
                        // 9. 该手机号下有用户名，说明该手机号已被注册
                        res.send({
                            code:203,
                            title:"一个手机号只能注册一个用户名",
                            data:"NOTDATA"
                        })
                    }else{
                        // 10. 该手机号下没有用户名，验证码是否正确
                        if(telData[0].code === code){
                            // 11. 验证码正确，注册成功
                            // 修改手机号对应数据的用户名 和 密码
                            const id = "user_" + uuid.v1();
                            sql.update({
                                colName:user,
                                where:{
                                    tel
                                },
                                data:{
                                    userId:id,
                                    userName:un,
                                    passWord:md5(pw),
                                    registerTime:Date.now(),
                                    loginState:0
                                }
                            }).then(()=>{
                                res.send({
                                    code:200,
                                    title:"注册成功",
                                    data:id
                                })
                            })
                        }else{
                            // 12. 验证码不对
                            res.send({
                                code:204,
                                title:"验证码不对",
                                data:"NOTDATA"
                            })
                        }
                    }
                }
            })
        }else{
            // 3. 根据用户名读取到数据了，说明用户名重名
            res.send({
                code:201,
                title:"用户名重复",
                data:"NOTDATA"
            })
        }
    })
})


/**
* @apiGroup 用户信息
* @api {post} /api/user/login 用户登录
* @apiVersion 0.0.0
* @apiDescription 根据 用户名+密码 或 手机号+密码 登录，注意，用户名和手机号有且只有一个即可
* @apiParam {String} username 用户名
* @apiParam {Number} tel 手机号
* @apiParam {String} password 密码
* @apiSuccess {number} code 请求状态
* @apiSuccess {string} title 请求说明
* @apiSuccess {array} data 请求数据
* @apiSuccessExample {json} Success-Response:
* {
*    "code":200,
*    "title":"登录成功",
*    "data":"用户id",
*    "token":"登录成功后的token"
* }
* {
*    "code":201,
*    "title":"用户名或手机号未注册",
*    "data":"NOTDATA"
* }
* {
*    "code":202,
*    "title":"密码不对",
*    "data":"NOTDATA"
* }
* @apiSampleRequest http://localhost:3000/api/user/login
*/
router.post('/login', function(req, res, next) {
    // 1. 将要接收到的登录信息
    const un = req.body.username;
    const tel = req.body.tel;
    const pw = req.body.password;

    // 2. 根据手机号或用户名查询数据
    sql.get({
        colName:user,
        where:{$or:[{userName:un},{tel}]}
    }).then(data=>{
        // 3. 没有查到数据，表示未注册
        if(data.length<1){
            res.send({
                code:201,
                title:"用户名或手机号未注册",
                data:"NOTDATA"
            })
        }else{
            // 4. 查询到数据，验证密码是否正确
            if(data[0].passWord === md5(pw)){
                // 5. 密码正确，修改用户信息为登录之后的状态
                sql.update({
                    colName:user,
                    where:{$or:[{userName:un},{tel}]},
                    data:{
                        loginState:1,
                        lastTime:Date.now()
                    }
                }).then(()=>{
                    // 生成token，在token内记录登录状态
                    const token = jwt.sign({
                        userId: data.userId,
                        abc: "哈哈哈"
                    }, "千锋H5，好！", {
                        expiresIn: 20
                    });

                    // 返回给前端
                    res.send({
                        code:200,
                        title:"登录成功",
                        data:data.userId,
                        token:token
                    })
                })
            }else{
                // 6. 密码不正确
                res.send({
                    code:202,
                    title:"密码不对",
                    data:"NOTDATA"
                })
            }
        }
    })
})




/**
* @apiGroup 用户信息
* @api {post} /api/user/getUser 获取用户信息
* @apiVersion 0.0.0
* @apiDescription 根据 登录成功之后的token获取用户信息
* @apiParam {String} token token
* @apiSuccess {number} code 请求状态
* @apiSuccess {string} title 请求说明
* @apiSuccess {array} data 请求数据
* @apiSuccessExample {json} Success-Response:
* {
*    "code":200,
*    "title":"获取成功",
*    "data":{用户数据},
*    "token":{解析之后的token内容}
* }
* {
*    "code":201,
*    "title":"登录失效",
*    "data":{token解析失败之后的内容}
* }
* @apiSampleRequest http://localhost:3000/api/user/getUser
*/

// 获取用户信息
router.post('/getUser', function(req, res, next) {
    const token = req.body.token;

    jwt.verify(token, "千锋H5，好！", (err,result)=>{
        if(err){
            res.send({
                code:201,
                title:"登录信息失效",
                data:err
            })
        }else{
            sql.get({
                colName:user,
                where:{userId: result.userId}
            }).then(data=>{
                res.send({
                    code:200,
                    title:"获取成功",
                    data:data[0],
                    token:result
                })
            })
        }
    })
})

module.exports = router;
